#ifndef TLV_H
#define TLV_H
#define DATA_MAX_SIZE 1024

#include "my_header.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iomanip>
#include <iostream>
#include <memory>

using std::cout;
using std::endl;


namespace wd{
class TLV{
public:
    //无参构造
    TLV();
    //有参构造
    TLV(int t,int len,const char* msg);
    //将数据存放在缓冲区
    void send_data(const char* msg,int len);
    //获取数据的类型
    int get_type();
    //获取数据的以字节表示的长度
    int get_length();
    //获取value实际数据的首地址
    const char* get_data();
    //获取TLV对象结构的首地址
    //返回 const void*，是为了适配网络发送函数（如 send）的参数要求 ——send 函数的第二个参数类型就是 const void*，
    //用于接收 “任意类型的二进制数据地址”
    const void* get_tlv_buff();
    //获取整个TLV数据的总字节大小
    int get_total_size();
    //打印调试
    void print();
    //静态解析函数(接收数据缓冲区，实际接收的字节数)
    static std::unique_ptr<TLV> parse_tlv_buff(const char* recvbuf,int recv_len); 
private:
    int _type;//类型,存储为网络字节序(大端)
    int _length;//标识数据以字节表示的长度
    char data[DATA_MAX_SIZE];//缓冲区,存储value值的实际数据
};

}//end of namespace wd

#endif
